﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// case внутри записи
    /// </summary>
    public class RecordCaseElement : SyntaxTreeElement, ISectionElementElement
    {
        private ITypeElement type;
        private List<RecordCaseBlockElement> blocks;
        
        /// <summary>
        /// Тип выбираемого значения
        /// </summary>
        public ITypeElement Type { get { return type; } set { type = value; } }

        /// <summary>
        /// Блоки объявлений переменных
        /// </summary>
        public List<RecordCaseBlockElement> Blocks { get { return blocks; } set { blocks = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Type">тип выбираемого значения</param>
        /// <param name="Blocks">блоки объявлений переменных</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public RecordCaseElement(TokenInfo StartInfo, ITypeElement Type, List<RecordCaseBlockElement> Blocks, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            type = Type;
            blocks = Blocks;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("case {0} of\r\n{1}", type, Tabulate(blocks.Join("\r\n")));
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            yield return type;
            foreach (RecordCaseBlockElement block in blocks)
                yield return block;
        }
    }
}
